package com.ufaud.ais.pub.entity;

import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.persistence.Transient;

import org.springframework.beans.BeanUtils;

public abstract class BaseEntity<PK extends Serializable> {

	@Override
	public String toString() {
		return getClass() + " id=" + getId();
	}

	@SuppressWarnings("unchecked")
	@Transient
	public PK getId() {
		PropertyDescriptor propDescriptor = BeanUtils.getPropertyDescriptor(getClass(), getPropertyNameOfId());
		Method IdGetter = propDescriptor.getReadMethod();
		try {
			return (PK) IdGetter.invoke(this, new Object[0]);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (InvocationTargetException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	@Transient
	public abstract String getPropertyNameOfId();
	// @Override
	// public String toString() {
	// return ReflectionToStringBuilder.toString(this, new ToStringStyle() {
	// private static final long serialVersionUID = 5285428321404134054L;
	// {
	// // setUseClassName(false);
	// setUseShortClassName(true);
	// // this.setUseFieldNames(false);
	// }
	// });
	// }
	//
	// @Override
	// public int hashCode() {
	// return HashCodeBuilder.reflectionHashCode(this);
	// }
	//
	// @Override
	// public boolean equals(Object obj) {
	// return EqualsBuilder.reflectionEquals(this, obj);
	// }
}
